Computer systems may be networked, such that software executing on one computing device may access hardware and/or software resources provided by another computing device. Further, software entities, such as virtual machines (VMs), may be executed by a group, or “cluster,” of networked host computing devices. Each VM creates an abstraction of physical computing resources, such as a processor and memory, of the host executing the VM and executes a “guest” operating system, which, in turn, executes one or more applications. The abstracted resources may be functionally indistinguishable from the underlying physical resources to the guest operating system and software applications.
The overall performance of such a cluster may be constrained by congestion in the network interconnecting the hosts. Congestion may be addressed at the level of a communication protocol, whether as an inherent feature of the protocol or as an extension to the protocol. For example, a host may execute a congestion management scheme and reduce its packet injection rate or “throttle down” when congestion is indicated by the communication protocol. However, such an approach may result in inconsistent throttling if any hosts use a different communication protocol and/or if not all hosts honor the congestion management scheme. Further, congestion may be addressed at least in part by collecting network performance data (e.g., round trip time) from network hardware, such as switches. Such network performance data may not accurately represent congestion between two endpoints, however, because performance measurements determined by network hardware may exclude at least the link between the network hardware and one of the endpoints.